#include "OutputLog.h"
#include "device_excute.h"
#include "print_rtt.h"
#include "stm32f4xx.h"
#define YEAR ((((__DATE__[7] - '0') * 10 + (__DATE__[8] - '0')) * 10 + (__DATE__[9] - '0')) * 10 + (__DATE__[10] - '0'))

#define MONTH (__DATE__[2] == 'n'   ? (__DATE__[1] == 'a' ? 1 : 6) \
               : __DATE__[2] == 'b' ? 2                            \
               : __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? 3 : 4) \
               : __DATE__[2] == 'y' ? 5                            \
               : __DATE__[2] == 'l' ? 7                            \
               : __DATE__[2] == 'g' ? 8                            \
               : __DATE__[2] == 'p' ? 9                            \
               : __DATE__[2] == 't' ? 10                           \
               : __DATE__[2] == 'v' ? 11                           \
                                    : 12)

#define DAY ((__DATE__[4] == ' ' ? 0 : __DATE__[4] - '0') * 10 + (__DATE__[5] - '0'))

#define FIRMWARE_VERSION_H 0x00
#define FIRMWARE_VERSION_L 0x01

#define FIRMWARE_RELEASE_YEAR  (__DATE__[9] - '0') * 10 + (__DATE__[10] - '0')
#define FIRMWARE_RELEASE_MONTH MONTH
#define FIRMWARE_RELEASE_DATE  DAY

#define MONTH_H (__DATE__[2] == 'n'   ? (__DATE__[1] == 'a' ? '0' : '0') \
                 : __DATE__[2] == 'b' ? '0'                              \
                 : __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? '0' : '0') \
                 : __DATE__[2] == 'y' ? '0'                              \
                 : __DATE__[2] == 'l' ? '0'                              \
                 : __DATE__[2] == 'g' ? '0'                              \
                 : __DATE__[2] == 'p' ? '0'                              \
                 : __DATE__[2] == 't' ? '1'                              \
                 : __DATE__[2] == 'v' ? '1'                              \
                                      : '1')

#define MONTH_L (__DATE__[2] == 'n'   ? (__DATE__[1] == 'a' ? '1' : '6') \
                 : __DATE__[2] == 'b' ? '2'                              \
                 : __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? '3' : '4') \
                 : __DATE__[2] == 'y' ? '5'                              \
                 : __DATE__[2] == 'l' ? '7'                              \
                 : __DATE__[2] == 'g' ? '8'                              \
                 : __DATE__[2] == 'p' ? '9'                              \
                 : __DATE__[2] == 't' ? '0'                              \
                 : __DATE__[2] == 'v' ? '1'                              \
                                      : '2')
#define DAY_H (__DATE__[4] == ' ' ? '0' : __DATE__[4])
#define DAY_L (__DATE__[5])
#define NUM_TO_CHAR(n)            \
  (n == 0) ? '0' : (n == 1) ? '1' \
               : (n == 2)   ? '2' \
               : (n == 3)   ? '3' \
               : (n == 4)   ? '4' \
               : (n == 5)   ? '5' \
               : (n == 6)   ? '6' \
               : (n == 7)   ? '7' \
               : (n == 8)   ? '8' \
               : (n == 9)   ? '9' \
               : (n == 10)  ? 'A' \
               : (n == 11)  ? 'B' \
               : (n == 12)  ? 'C' \
               : (n == 13)  ? 'D' \
               : (n == 14)  ? 'E' \
               : (n == 15)  ? 'F' \
                            : '?'
const char Flash_Store_version[] __attribute__((at(0x08000300))) = {
    '4', '0', '7', '-', 'D', 'G', 'U',
    '-',
    'B', 'O', 'O', 'T', 'L', 'O', 'A', 'D', 'E', 'R',
    '-',
    'V', NUM_TO_CHAR(FIRMWARE_VERSION_H), '.', NUM_TO_CHAR(FIRMWARE_VERSION_L),
    '-',
    __DATE__[9],
    __DATE__[10],
    MONTH_H,
    MONTH_L,
    DAY_H,
    DAY_L};
int main(void)
{
  uint8_t status = 0;
  DEVICE_EXCUTE_HANDLER excute_device_prrocess[] = {
      device_excute_shunt,
      device_excute_move_new_app_to_local,
      device_excute_jump_app,
      device_excute_error

  };
  volatile int length = sizeof(PARAMETER_STORE_DPT);
  print_rtt_init("DGU bootloader startup.....\r\n");
  while (1)
  {
    excute_device_prrocess[status](&status);
  }
}
